#
# %CopyrightBegin%
#
# Copyright Ericsson AB 2009-2016. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# %CopyrightEnd%
#

include $(ERL_TOP)/make/output.mk
include $(ERL_TOP)/make/target.mk
include $(ERL_TOP)/erts/include/internal/$(TARGET)/ethread.mk

USING_MINGW=@MIXED_CYGWIN_MINGW@
USING_VC=@MIXED_VC@

CC=@CC@
LD=@LD@
AR=@AR@
RANLIB=@RANLIB@
RM=@RM@
MKDIR=@MKDIR@
INSTALL=@INSTALL@
INSTALL_DIR=@INSTALL_DIR@
INSTALL_DATA=@INSTALL_DATA@
INSTALL_PROGRAM=@INSTALL_PROGRAM@
LDFLAGS=@LDFLAGS@

ifeq ($(TYPE),debug)
CFLAGS = @DEBUG_CFLAGS@ -DDEBUG
TYPEMARKER=.debug
PRE_LD =
ifeq ($(TARGET),win32)
LDFLAGS += -g
endif
else
ifeq ($(TYPE),purify)
CFLAGS = @CFLAGS@ -DPURIFY
TYPEMARKER=.purify
PRE_LD = purify $(PURIFY_BUILD_OPTIONS)
else
ifeq ($(TYPE),quantify)
CFLAGS = @CFLAGS@ -DQUANTIFY
TYPEMARKER=.quantify
PRE_LD = quantify $(QUANTIFY_BUILD_OPTIONS)
else
ifeq ($(TYPE),purecov)
CFLAGS = @DEBUG_CFLAGS@ -DPURECOV
TYPEMARKER=.purecov
PRE_LD = purecov $(PURECOV_BUILD_OPTIONS)
else
override TYPE=opt
CFLAGS = @CFLAGS@
PRE_LD =
TYPEMARKER =
endif
endif
endif
endif

ifeq ($(findstring -D_GNU_SOURCE,$(CFLAGS)),)
THR_DEFS = $(ETHR_DEFS)
else
# Remove duplicate -D_GNU_SOURCE
THR_DEFS = $(filter-out -D_GNU_SOURCE%, $(ETHR_DEFS))
endif

LIBS=@LIBS@
CREATE_DIRS=

TT_DIR=$(TARGET)/$(TYPE)

BIN_DIR=../bin/$(TARGET)
OBJ_DIR=../obj/$(TT_DIR)

CREATE_DIRS += $(BIN_DIR) $(OBJ_DIR)

PROGS=
DRIVERS=


#
# emem sources, objects, includes, libs, etc...
#


ifneq ($(strip $(ETHR_LIB_NAME)),)
# Need ethread package for emem
PROGS += $(BIN_DIR)/emem$(TYPEMARKER)@EXEEXT@
endif

EMEM_OBJ_DIR=$(OBJ_DIR)/emem
CREATE_DIRS += $(EMEM_OBJ_DIR)

EMEM_INCLUDES =	-I$(ERL_TOP)/erts/include \
		-I$(ERL_TOP)/erts/include/$(TARGET) \
		-I$(ERL_TOP)/erts/include/internal \
		-I$(ERL_TOP)/erts/include/internal/$(TARGET)

EMEM_HEADERS = erl_memory_trace_block_table.h
EMEM_SRCS = erl_memory.c erl_memory_trace_block_table.c

EMEM_CFLAGS = $(THR_DEFS) $(subst O2,O3, $(CFLAGS)) $(EMEM_INCLUDES)
EMEM_LDFLAGS = $(LDFLAGS)

ifeq ($(USING_VC), yes)
ifeq ($(TYPE),debug)
MT_LIB=MDd
else
MT_LIB=MD
endif

EMEM_CFLAGS += -$(MT_LIB)
EMEM_LDFLAGS += -$(MT_LIB)
EMEM_ERTS_LIB=erts_$(MT_LIB)$(TYPEMARKER)

else

EMEM_ERTS_LIB=erts_r$(TYPEMARKER)

endif

EMEM_ETHR_LIBS=$(subst -l$(ETHR_LIB_NAME),-l$(ETHR_LIB_NAME)$(TYPEMARKER),$(subst -lerts_internal_r,-lerts_internal_r$(TYPEMARKER),$(ETHR_LIBS)))

EMEM_LIBS =	$(LIBS) \
		-L$(ERL_TOP)/erts/lib/$(TARGET) \
		-L$(ERL_TOP)/erts/lib/internal/$(TARGET) \
		-l$(EMEM_ERTS_LIB) \
		$(EMEM_ETHR_LIBS)

EMEM_OBJS = $(addprefix $(EMEM_OBJ_DIR)/,$(notdir $(EMEM_SRCS:.c=.o)))

ERTS_LIB = $(ERL_TOP/erts/lib_src/obj/$(TARGET)/$(TYPE)/MADE

#
# Misc targets
#

_create_dirs := $(shell mkdir -p $(CREATE_DIRS))

all: $(PROGS) $(DRIVERS)

$(ERTS_LIB):
	$(make_verbose)cd $(ERL_TOP)/erts/lib_src && $(MAKE) $(TYPE)


docs:

clean:
	$(RM) -rf ../obj/*
	$(RM) -rf ../bin/*
	$(RM) -f ./*~

.PHONY: all erts_lib docs clean

#
# Object targets
#

$(EMEM_OBJ_DIR)/%.o: %.c
	$(V_CC) $(EMEM_CFLAGS) -o $@ -c $<

#
# Driver targets
#

#
# Program targets
#

$(BIN_DIR)/emem$(TYPEMARKER)@EXEEXT@: $(EMEM_OBJS) $(ERTS_LIB)
	$(ld_verbose)$(PRE_LD) $(LD) $(EMEM_LDFLAGS) -o $@ $(EMEM_OBJS) $(EMEM_LIBS)

#
# Release targets
#
include $(ERL_TOP)/make/otp_release_targets.mk
include ../vsn.mk
RELSYSDIR = $(RELEASE_PATH)/lib/tools-$(TOOLS_VSN)

release_spec: all
	$(INSTALL_DIR) "$(RELSYSDIR)/c_src"
	$(INSTALL_DATA) $(EMEM_SRCS) $(EMEM_HEADERS) "$(RELSYSDIR)/c_src"
ifneq ($(PROGS),)
	$(INSTALL_DIR) "$(RELSYSDIR)/bin"
	$(INSTALL_PROGRAM) $(PROGS) "$(RELSYSDIR)/bin"
endif

release_docs_spec:

.PHONY: release_spec release_docs_spec

#
# Make dependencies
#

ifeq ($(USING_VC), yes)
DEP_CC=@EMU_CC@
else
DEP_CC=$(CC)
endif

SED_REPL_EMEM_OBJ_DIR=s|^\([^:]*\)\.o:|$$(EMEM_OBJ_DIR)/\1.o:|g
SED_REPL_OBJ_DIR=s|^\([^:]*\)\.o:|$$(OBJ_DIR)/\1.o:|g
SED_REPL_TT_DIR=s|$(TT_DIR)/|$$(TT_DIR)/|g
SED_REPL_TARGET=s|$(TARGET)/|$$(TARGET)/|g
SED_REPL_ERL_TOP=s|$(ERL_TOP)/|$$(ERL_TOP)/|g

SED_EMEM_DEPEND=sed '$(SED_REPL_EMEM_OBJ_DIR);$(SED_REPL_TT_DIR);$(SED_REPL_TARGET);$(SED_REPL_ERL_TOP)'
SED_DEPEND=sed '$(SED_REPL_OBJ_DIR);$(SED_REPL_TT_DIR);$(SED_REPL_TARGET);$(SED_REPL_ERL_TOP)'

DEPEND_MK=depend.mk

dep depend:
	[ $(v_p) == 0 ] && echo " GEN	"$(DEPEND_MK)
	$(V_colon)@echo "Generating dependency file $(DEPEND_MK)..."
	@echo "# Generated dependency rules." > $(DEPEND_MK);
	@echo "# Do *not* edit this file; instead, run 'make depend'." \
		>> $(DEPEND_MK);
	@echo "# " >> $(DEPEND_MK);
	@echo "# emem objects..." >> $(DEPEND_MK);
	$(DEP_CC) -MM $(EMEM_CFLAGS) $(EMEM_SRCS) \
		| $(SED_EMEM_DEPEND) >> $(DEPEND_MK)
	@echo "# EOF" >> $(DEPEND_MK);

.PHONY: dep depend

include $(DEPEND_MK)

# eof
